package br.com.vilababy.sigvb.mb.aluno;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.mb.AbstractAlunoMBean;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Responsavel;
import br.com.vilababy.sigvb.repository.AlunoRepository;
import br.com.vilababy.sigvb.repository.ResponsavelRepository;

@ManagedBean
@ViewScoped
public class PesquisaMBean extends AbstractAlunoMBean implements Serializable {

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	private static final long serialVersionUID = 1L;
	private Responsavel paiConsulta;
	private Responsavel maeContulta;
	
	public PesquisaMBean() {
		setRepositoryAluno(new AlunoRepository());
		this.paiConsulta = new Responsavel();
		this.maeContulta = new Responsavel();
		setAlunos(new ArrayList<Aluno>());
	}
	
	@PostConstruct
	private void carregarListas() {
		consultarAlunosPaginacao();
	}
	
	public Responsavel getPaiConsulta() {
		return paiConsulta;
	}

	public void setPaiConsulta(Responsavel paiConsulta) {
		this.paiConsulta = paiConsulta;
	}

	public Responsavel getMaeContulta() {
		return maeContulta;
	}

	public void setMaeContulta(Responsavel maeContulta) {
		this.maeContulta = maeContulta;
	}

	public void pesquisarAluno(ActionEvent evento) {
		try {
			consultarAlunosPaginacao();
		} catch (Exception ex) {
			SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_PESQUISA.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_PESQUISA_ALUNO.getValor()));
		}
		adicionarMapaAlunos();
	}
	
	private void consultarAlunosPaginacao() {
		setAlunosPaginacao(new LazyDataModel<Aluno>() {

			private static final long serialVersionUID = 1L;
			
			@Override
			public Aluno getRowData(String rowKey) {
				for (Aluno aluno : getAlunosPaginacao())
					if (String.valueOf(aluno.getId()).equals(rowKey))
						return aluno;
				
				return null;
			}
			
			@Override
			public Object getRowKey(Aluno aluno) {
				return aluno.getId();
			}
			
			@Override
			public List<Aluno> load(int primeiroRegistro, int totalRegistrosPagina,
					String sortField, SortOrder sortOrder, Map<String, Object> filtros) {
				if (((getAluno().getNome() != null && !getAluno().getNome().isEmpty()) || (getAluno().getApelido() != null && !getAluno().getApelido().isEmpty())) && 
						((getPaiConsulta().getNome() != null && !getPaiConsulta().getNome().isEmpty()) || (getMaeContulta().getNome() != null && !getMaeContulta().getNome().isEmpty()))) {
					primeiroRegistro = 0;
					List<Aluno> alunos1 = ((AlunoRepository) getRepositoryAluno()).listarParcialAlunoPaisNome(getAluno(), getPaiConsulta(), getMaeContulta(), primeiroRegistro, totalRegistrosPagina);
					List<Aluno> alunos2 = ((AlunoRepository) getRepositoryAluno()).listar(getAluno(), primeiroRegistro, totalRegistrosPagina);
				 	setAlunos(eliminarElementosRepetidos(alunos1,alunos2));
					if (getAlunos().isEmpty())
						return new ArrayList<Aluno>();
					setRowCount(getAlunos().size());
				} else if (((getAluno().getNome() != null && !getAluno().getNome().isEmpty()) || (getAluno().getApelido() != null && !getAluno().getApelido().isEmpty())) && 
							((getPaiConsulta().getNome() == null || getPaiConsulta().getNome().isEmpty()) && (getMaeContulta().getNome() == null || getMaeContulta().getNome().isEmpty()))) { 
					setRowCount(((AlunoRepository) getRepositoryAluno()).totalAlunosConsultados(getAluno()));
					primeiroRegistro = 0;
				} else if (((getPaiConsulta().getNome() != null && !getPaiConsulta().getNome().isEmpty()) || (getMaeContulta().getNome() != null && !getMaeContulta().getNome().isEmpty())) && 
								((getAluno().getNome() == null || getAluno().getNome().isEmpty()) && (getAluno().getApelido() == null || getAluno().getApelido().isEmpty()))) {
					setRowCount(((AlunoRepository) getRepositoryAluno()).totalAlunosConsultadosPaisNome(getAluno(), getPaiConsulta(), getMaeContulta()));
					primeiroRegistro = 0;
				} else {
					setRowCount(((AlunoRepository) getRepositoryAluno()).totalAlunosFiltrados());
				}
					
				setPageSize(totalRegistrosPagina);
				
				if (!getAlunos().isEmpty()) {
					return getAlunos();
				}
				
				if ((getPaiConsulta().getNome() != null && !getPaiConsulta().getNome().isEmpty()) ||
						(getMaeContulta().getNome() != null && !getMaeContulta().getNome().isEmpty())) {
					return ((AlunoRepository) getRepositoryAluno()).listarParcialAlunoPaisNome(getAluno(), getPaiConsulta(), getMaeContulta(), primeiroRegistro, totalRegistrosPagina);
				} 
				
				return ((AlunoRepository) getRepositoryAluno()).listar(getAluno(), primeiroRegistro, totalRegistrosPagina);
				
			}
			
		});
	}
	
	private List<Aluno> eliminarElementosRepetidos(List<Aluno> alunos1, List<Aluno> alunos2) {
		List<Aluno> alunosRemover = new ArrayList<Aluno>();
		for (Aluno aluno : alunos1) {
			if (!alunos2.contains(aluno))
				alunosRemover.add(aluno);
		}
		
		alunos1.removeAll(alunosRemover);
		
		return alunos1;
	}
	
	public void exibirAlunoSelecionado(SelectEvent evento) {
		ResponsavelMBean responsavelBean = new ResponsavelMBean();
		setAlunoSelecionado(getRepositoryAluno().get(((Aluno)evento.getObject()).getId()));
		
		getAlunoSelecionado().setResponsaveis(((ResponsavelRepository) responsavelBean.getRepositoryResponsavel()).getPais(getAlunoSelecionado()));
		
		if (getAlunoSelecionado().getResponsaveis() != null && !getAlunoSelecionado().getResponsaveis().isEmpty()) {
			setPaiDetalhe(getAlunoSelecionado().getResponsaveis().get(0));
			setMaeDetalhe(getAlunoSelecionado().getResponsaveis().get(1));
		}
	}
	
}
